<?php
if(!isset($ruta_raiz))
	$ruta_raiz="../";
else if(! strpos($ruta_raiz,"/"))
 		$ruta_raiz.="/";
error_reporting(0) ;		
require_once("combinador.cfg.php");
require_once( "ArchivosDoc.php" );
require_once( "ArchivosOdt.php" );
require_once("ArchivosXML.php" );



/**
 * @author Aquiles Canto 
 * @version 1.0 
 * 01-11-2008 
 * clase qu proporciona los métodos que proporciona
 * una interfaz para los posibles documentos a combinar
 *
 */
abstract class CombinadorFactory{
	/**
	 * constante que indica que se combinara un documento  con extension .doc
	 */
	const DOC='doc';
	/**
	 * constante que indica que se combinara un documento  con extension .odt
	 */
	const ODT='odt';
	/**
	 * constante que indica que se combinara un documento  con extension .xml
	 */
	const XML='xml';
	/**
	 * nombre del archivo insumo que sera creado para realizar la combinacvion
	 * @var String
	 */
	protected  $nombreInsumo;
	/**
	 * ruta en la cual se almacena el archivo insumo
	 * @var String
	 */
	protected  $rutaInsumo;
	/**
	 * datos que seran almacenados en el archivo insumo y que seran valores para 
	 * la combinacion
	 * @var String
	 */
	protected  $datosInsumo;
	/**
	 * almacena la ruta del completo del archivo que funcionmara copo plantilla para ser combinado
	 * @var String
	 */
	protected  $archivoCombinar;
	/**
	 * Se verifica si se desea generar el archivo o si se desea ver una vista 
	 * previa del Documento
	 *
	 * @var boolean
	 */
	protected  $vistaPrevia=false;
	/**
	 * valores que seran remplazados en la combinacion 
	 *
	 * @var array(String)
	 */
	protected  $valores=array();
	/**
	 * campos variables que se seran utilizados para la combinacion y que se 
	 * encuentran en la plantilla
	 *
	 * @var array();
	 */
	protected  $variables=array();
	/**
	 * almacena el directorio que sera utilizado como cahe para ralizar 
	 * operaciones 
	 *
	 * @var String
	 */
	protected $cache="bodega/tmp/workDir/";
	/**
	 * Enlace del Archivo a ser combinado por lo general es un 
	 * atributo de los Documentos(radicados) u Anexos
	 *
	 * @var Srting
	 */
	protected $enlaceArchivo;
	/**
	 * Enlace al Archivo Temporal que sera combinado;
	 *
	 * @var String
	 */
	protected $enlaceTemporal;
	
	/**
	 * enlace del archivo generado por el combinador
	 *
	 * @var String
	 */
	protected $archivoCombinador;
	public function CombinadorFactory(){
		$this->nombreInsumo="tmp_".date("Y_m_d_H_i_s").".txt";
	}
	
	/**
	 * metodo encargado de fabricar el elementoencargado de 
	 * manejar la combinacion de los documentos dependiendo del tipo de 
	 * archivo que se desea combinar
	 *
	 * @param unknown_type $tipoDoc
	 * @return unknown
	 */
	public static function getCombinadorFactory($enlaceArchivo){
		$objFactory=null;
		$enlaceArchivo=strtolower($enlaceArchivo);
		$tipoDoc=substr($enlaceArchivo,-3);
		switch($tipoDoc){
			case self::DOC:
				$objFactory=new ArchivosDoc($enlaceArchivo);
				break;
			case self::XML:
				$objFactory=new ArchivosXML($enlaceArchivo);
				break;
			case self::ODT:
				$objFactory= new ArchivosOdt($enlaceArchivo);
				break;
			default:
				$objFactory=null;			
		}
		return $objFactory;
	}
	public function setVistaPrevia($vistaPrevia){
		$this->vistaPrevia=$vistaPrevia;
	}
	public function isVistaPrevia(){
		return $this->vistaPrevia;
	}
	public function setNombreInsumo($nombreInsumo){
		$this->nombreInsumo=$nombreInsumo;
	}
	public function getNombreInsumo(){
		return $this->nombreInsumo;
	}
	public function setRutaInsumo($rutaInsumo){
		$this->rutaInsumo=$rutaInsumo;
	}
	public function getCache(){
		global $ruta_raiz;
		return $ruta_raiz.$this->cahe;
	}
	public function setCache($cache){
		$this->cache=$cache;
	}
	public function getArchivoCombinador(){
		return $this->archivoCombinador;
	}
	public function setArchivoCombinador($archivoCombinador){
		$this->archivoCombinador=$archivoCombinador;
	}
	public function getEnlaceArchivo(){
		return $this->enlaceArchivo;
	}
	/**
	 * metodo encargado de almcenar y generar los elementos 
	 * de insumo para la combinacion. 
	 *
	 * @param unknown_type $campos
	 */
	public abstract function generarArchivoInsumo($campos);
	//protected  abstract  function generarCombinacion();
	/**
	 * metodo el cual se encarga de generar la combinacion de los documentos
	 *
	 */
	protected abstract function combinar();
	/**
	 * funcion que genera el documento si opcionalmente si se desea almacenar el doc
	 * dentro de las bodegas.
	 *
	 *
	 */
	protected abstract function salvar();
	public function setArchivoCombinar(){
		global $dirCombinacionTEMP,$ruta_raiz;
		$nombreArchivo=substr($this->enlaceArchivo,strrpos($this->enlaceArchivo,"/")+1);
		//$this->enlaceTemporal=$ruta_raiz.strtolower($this->rutaInsumo);
		$fechah=date("Ymd_His");
		$this->enlaceTemporal=$this->archivoCombinador=$this->rutaInsumo.$nombreArchivo;
		try {
		$copia=@copy($this->enlaceArchivo,$this->archivoCombinador);
		}catch (ErrorException $e){	
			throw new Exception("No se pudo tener accesso al archivo --"+$this->enlaceArchivo);
			
		}	
	}
	public function getArchivoCombinar(){
		return $this->archivoCombinar;
	}
	public function generarCombinacion(){
		$this->combinar();
		return $this->salvar();
	}
}

?>